/*
 * @Author: 码农 2646995216@qq.com
 * @Date: 2025-03-16 00:10:33
 * @LastEditors: 码农 2646995216@qq.com
 * @LastEditTime: 2025-03-17 14:38:34
 * @FilePath: /socket_tcp/client.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include<iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <string>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

class Client
{
public:
	//构造函数
	Client(string& ip,uint16_t& port)
		:_ip(ip),_port(port),_socket(-1)
	{}

	//初始化
	void ClientInit()
	{
		_socket=socket(AF_INET, SOCK_STREAM, 0);//创建套接字
		if(_socket<0)
		{
			cout<<"socket false"<<endl;
			exit(1);
		}
	}

	//客户端启动
	void ClientStart()
	{
		struct sockaddr_in local;
		local.sin_family=AF_INET;         // 表示使用ipv4
		local.sin_port=htons(_port);      // 将端口号网络字节序
		local.sin_addr.s_addr=inet_addr(_ip.c_str()); // 传入IP地址
		socklen_t len=sizeof(local);

		//客户端连接服务器
		int n=connect(_socket,(struct sockaddr*)&local,len);
		if(n<0)
		{
			cout<<"connect false"<<endl;
			exit(2);
		}
		cout<<"connect: "<<n<<endl;
        
		string msg;
		while(true)
		{
			//向服务器发送数据
			cout<<"Client say#";
			getline(cin,msg);
			write(_socket,msg.c_str(),msg.size());
            
			//接收服务器返回的数据
			char buffer[1024];
			int m=read(_socket,buffer,sizeof(buffer)-1);
			if(m>0)
			{
				buffer[m]='\0';
				cout<<"Server return: "<<buffer<<endl;
			}
			else
			{
				//read返回0，证明服务端关闭，客户端也要关闭
				cout<<"Server quit"<<endl;
				break;
			}		
		}
		
	}

	//析构函数要释放不使用的文件描述符
	~Client()
	{
		close(_socket);
	}
private:
	int _socket;//套接字
	string _ip;//ip地址
	uint16_t _port;//端口号
};































